/*
 * commons is a based project implemented
 * Copyright (C) 2024 Jasmine
 */
package com.easy.database.handler;

import java.util.Arrays;
import java.util.List;

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;

/**
 * 表名处理
 *
 * @author Jasmine
 * @since 1.0.0
 */
public class DynamicEntityTableNameHandler implements TableNameHandler {
    /**
     * 用于记录哪些表可以使用该月份动态表名处理器
     */
    private List<String> tableNames;

    /**
     * 每个请求线程维护一个表名后缀数据，避免多线程数据冲突。所以使用ThreadLocal
     */
    private static final ThreadLocal<String> tableNameSuffix = new ThreadLocal<>();

    public DynamicEntityTableNameHandler(String... tableNames) {
        this.tableNames = Arrays.asList(tableNames);
    }

    public DynamicEntityTableNameHandler(List<String> tableNameList) {
        this.tableNames = tableNameList;
    }

    /**
     * 置请求线程的month数据
     */
    public static void setTableNameSuffix(String suffix) {
        tableNameSuffix.set(suffix);
    }

    /**
     * 删除当前请求线程的数据
     */
    public static void removeTableNameSuffix() {
        tableNameSuffix.remove();
    }

    /**
     * 自定义动态表名
     *
     * @param sql 当前执行 SQL
     * @param tableName 表名 entity里注解传入的表明
     * @return
     */
    @Override
    public String dynamicTableName(String sql, String tableName) {
        if (this.tableNames.contains(tableName)) {
            // 表名增加后缀
            return tableName + tableNameSuffix.get();
        }
        // 表名原样返回
        return tableName;
    }
}
